home *** CD-ROM | disk | FTP | other *** search
- PROGRAM DIRECT_EXAMPLE;
-
- %INCLUDE '/SYS/INS/BASE.INS.PAS';
- %INCLUDE '/SYS/INS/GPR.INS.PAS';
- %INCLUDE '/SYS/INS/KBD.INS.PAS';
- %INCLUDE '/SYS/INS/PAD.INS.PAS';
- %INCLUDE '/SYS/INS/ERROR.INS.PAS';
-
- CONST
- LF = CHR(10);
- CR = CHR(13);
- SP = CHR(32);
-
- FOREVER = FALSE;
-
- VAR
- event : GPR_$EVENT_T;
- status : STATUS_$T;
- cur_position : GPR_$POSITION_T;
- event_type : GPR_$EVENT_T;
- ch : CHAR;
- i : INTEGER;
- timeout : TIME_$CLOCK_T;
- disp_bm_size : GPR_$OFFSET_T;
- init_bitmap : GPR_$BITMAP_DESC_T;
- unobscured : BOOLEAN;
- fwidth : INTEGER;
- fhite : INTEGER;
- fname : PAD_$STRING_T;
- fnsize : INTEGER;
- fnlen : INTEGER;
- fid : INTEGER;
- start : GPR_$OFFSET_T;
- xend : INTEGER;
- window : PAD_$WINDOW_DESC_T;
- stream_out : STREAM_$ID_T;
- stream_in : STREAM_$ID_T;
- cur_origin : GPR_$POSITION_T;
-
- (* The following procedure will scroll the terminal emulator screen by one *)
- (* full line. *)
-
- PROCEDURE scroll;
-
- VAR
- bitmap_desc : GPR_$BITMAP_DESC_T;
-
- source_window : GPR_$WINDOW_T;
- source_plane : GPR_$PLANE_T;
- dest_origin : GPR_$POSITION_T;
- dest_plane : GPR_$PLANE_T;
- status : STATUS_$T;
-
- BEGIN
- GPR_$INQ_BITMAP(bitmap_desc, status);
- GPR_$SET_BITMAP(bitmap_desc, status);
-
- WITH source_window DO
- BEGIN
- WITH window_base DO
- BEGIN
- x_coord := 0;
- y_coord := fhite+7;
- END;
- WITH window_size DO
- BEGIN
- x_size := 80*fwidth;
- y_size := 25*fhite;
- END;
- END;
- source_plane := 0;
- WITH dest_origin DO
- BEGIN
- x_coord := 0;
- y_coord := 7;
- END;
- dest_plane := 0;
-
- GPR_$PIXEL_BLT(bitmap_desc, source_window, dest_origin, status);
- END; (* of scroll *)
-
- BEGIN
- { initialize specifying direct mode }
- stream_out := STREAM_$ERROUT;
- stream_in := STREAM_$ERRIN;
-
- fwidth := 11;
- fhite := 23;
-
- disp_bm_size.x_size := 1024;
- disp_bm_size.y_size := 1024;
- GPR_$INIT(GPR_$BORROW, 1, disp_bm_size, 0, init_bitmap, status);
- IF status.all <> STATUS_$OK
- THEN
- BEGIN
- WRITELN('Unable to initialize graphics mode.');
- ERROR_$PRINT(status);
- END;
-
- { set up text font that will be used in direct window }
-
- GPR_$LOAD_FONT_FILE('/SYS/DM/FONTS/F9X15', 19, fid, status);
- GPR_$SET_TEXT_FONT(fid, status);
-
- { set time-out to 5 seconds }
-
- timeout.low32 := 5*250000;
- timeout.high16 := 0;
- GPR_$SET_ACQ_TIME_OUT(timeout, status);
-
- { enable keystroke event and characters from 0 to 127 which includes all }
- { keys }
-
- GPR_$ENABLE_INPUT(GPR_$KEYSTROKE, [chr(0) .. chr(127),
- KBD_$CR, KBD_$LEFT_ARROW,
- KBD_$RIGHT_ARROW, KBD_$UP_ARROW,
- KBD_$DOWN_ARROW, KBD_$BS], status);
- cur_position.x_coord := 0;
- cur_position.y_coord := fhite-1;
- cur_origin.x_coord := 0;
- cur_origin.y_coord := 8;
- GPR_$SET_CURSOR_ORIGIN(cur_origin, status);
- GPR_$SET_CURSOR_POSITION(cur_position, status);
- GPR_$SET_CURSOR_ACTIVE(TRUE, status);
-
- REPEAT
- { call event wait and wait for a keystrokee event, char, and cursor pos }
-
- unobscured := GPR_$EVENT_WAIT(event, ch, cur_position, status);
-
- { print char at present cursor position and then move the cursor to the }
- { next position }
-
- IF event = GPR_$KEYSTROKE
- THEN
- BEGIN
- IF ORD(ch) = 3 THEN EXIT;
- GPR_$SET_CURSOR_ACTIVE(FALSE, status);
-
- { determine width of character from font, and move the cursor by }
- { that amount in preparation for next input character }
-
- CASE ch OF
- CR, KBD_$CR :
- BEGIN
- cur_position.x_coord := 0;
- cur_position.y_coord := cur_position.y_coord + fhite;
- IF cur_position.y_coord > 24*fhite
- THEN
- BEGIN
- scroll;
- cur_position.y_coord := 24*fhite;
- END;
- END;
- KBD_$BS :
- BEGIN
- IF cur_position.x_coord - fwidth >= 0
- THEN
- BEGIN
- cur_position.x_coord := cur_position.x_coord - fwidth;
- GPR_$MOVE(cur_position.x_coord, cur_position.y_coord,
- status);
- GPR_$TEXT(SP, 1, status);
- END;
- END;
- KBD_$LEFT_ARROW :
- BEGIN
- IF cur_position.x_coord - fwidth >= 0
- THEN
- cur_position.x_coord := cur_position.x_coord - fwidth
- ELSE
- cur_position.x_coord := 0;
- END;
- KBD_$RIGHT_ARROW :
- BEGIN
- IF cur_position.x_coord + fwidth <= 79*fwidth
- THEN
- cur_position.x_coord := cur_position.x_coord + fwidth
- ELSE
- cur_position.x_coord := 79*fwidth;
- END;
- KBD_$UP_ARROW :
- BEGIN
- IF cur_position.y_coord - fhite >= fhite-1
- THEN
- cur_position.y_coord := cur_position.y_coord - fhite
- ELSE
- cur_position.y_coord := fhite-1;
- END;
- KBD_$DOWN_ARROW :
- BEGIN
- IF cur_position.y_coord + fhite <= 24*fhite
- THEN
- cur_position.y_coord := cur_position.y_coord + fhite
- ELSE
- cur_position.y_coord := 24*fhite;
- END;
- OTHERWISE
- BEGIN
- GPR_$MOVE(cur_position.x_coord, cur_position.y_coord, status);
- GPR_$TEXT(ch, 1, status);
- cur_position.x_coord := cur_position.x_coord + fwidth;
- IF cur_position.x_coord > 79*fwidth
- THEN
- BEGIN
- cur_position.x_coord := 0;
- cur_position.y_coord := cur_position.y_coord + fhite;
- IF cur_position.y_coord > 24*fhite
- THEN
- BEGIN
- scroll;
- cur_position.y_coord := 24*fhite;
- END;
- END;
- END; (* of otherwise *)
- END; (* of case *)
-
- GPR_$SET_CURSOR_POSITION(cur_position, status);
-
- GPR_$SET_CURSOR_ACTIVE(true, status);
- END;
- UNTIL FOREVER;
-
- GPR_$DISABLE_INPUT(GPR_$KEYSTROKE, status);
-
- { terminate direct mode graphics }
-
- GPR_$TERMINATE(FALSE, status);
-
- END.
-